#include "CarStop.h"
#include "LinkQueue.h"
#include "LinkStack.h"

// int main()
// {
//     CarStop s(3);
//     while(1)
//     {
//         s.Show();
//         std::cout<<"1、车辆进入停车场\n";
//         std::cout<<"2、车辆离开停车场\n";
//         std::cout<<"3、退出\n";

//         int choice = 0;
//         std::cin>>choice;
//         switch(choice)
//         {
//             case 1:s.ComeCar();break;
//             case 2:s.LeaveCar();break;
//             case 3:return 0;
//             default:
//                 break;
//         }
//     }
// }

//两个栈实现一个队列

class MyQueue
{
public:
    using ElementType = LinkQueue::ElementType;
    void Push(const ElementType& element)
    {
        while(s2.IsEmpty() == false)
        {
            s1.Push(*s2.GetTop());
            s2.Pop();
        }
        s1.Push(element);
    }
    void Pop()
    {
        while(s1.IsEmpty() == false)
        {
            s2.Push(*s1.GetTop());
            s1.Pop();
        }
        s2.Pop();
    }

    ElementType *GetFront()
    {
        while(s1.IsEmpty() == false)
        {
            s2.Push(*s1.GetTop());
            s1.Pop();
        }
        return s2.GetTop();
    }

    bool IsEmpty()
    {
        return s1.IsEmpty() && s2.IsEmpty();
    }

private:
    LinkStack s1;
    LinkStack s2;
};

//两个队列实现一个栈
class MyStack
{
public:
    using ElementType = LinkStack::ElementType;
    void Push(const ElementType& element)
    {
        while(q2.IsEmpty() == false)
        {
            q1.Push(*q2.GetFront());
            q2.Pop();
        }
        q1.Push(element);
    }
    void Pop()
    {
        while(q1.Size() > 1)
        {
            q2.Push(*q1.GetFront());
            q1.Pop();
        }
        q1.Pop();
        while(q2.IsEmpty() == false)
        {
            q1.Push(*q2.GetFront());
            q2.Pop();
        }
    }

    ElementType *GetTop()
    {
        while(q1.Size() > 1)
        {
            q2.Push(*q1.GetFront());
            q1.Pop();
        }
        ElementType *r =(ElementType *) *q1.GetFront();
        q2.Push(*q1.GetFront());
        q1.Pop();
        while(q2.IsEmpty() == false)
        {
            q1.Push(*q2.GetFront());
            q2.Pop();
        }
        return r;
    }

    bool IsEmpty()
    {
        return q1.IsEmpty() && q2.IsEmpty();
    }

private:
    LinkQueue q1;
    LinkQueue q2;
};

int main()
{
    MyStack q;
  for (long i = 1; i <= 10; i++)
    q.Push((void *)i);
  while (q.IsEmpty() == false)
  {
    std::cout << (long)q.GetTop() << " ";
    q.Pop();
  }
  std::cout << std::endl;

  return 0;
}